#ifndef __DRIVER_FLASH_
#define __DRIVER_FLASH_

#include "Driver_spi.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "debug.h"

#define START   0                   //启动
#define STOP    1                   //停止
#define W25QXX_CS_PORT   PBout(12)  //Flash芯片的片选引脚（在SPI初始化函数中使能）

/*------------------命令定义--------------------*/
#define W25Q32ID                     0xEF4016    //芯片的ID号
#define W25Qxx_WriteEnable           0x06        //使能Flash芯片命令
#define W25Qxx_WriteDisable          0x04        //失能Flash芯片命令
#define W25Qxx_ReadStatusReg         0x05        //读取状态寄存器命令
#define W25Qxx_WriteStatusReg        0x01        //写入状态寄存器命令
#define W25Qxx_ReadData              0x03        //读取数据
#define W25Qxx_FastRead              0x0B        //快速读取数据
#define W25Qxx_PageProgram           0x02        //写入一页数据（每页256字节）
#define W25Qxx_SectorErase           0x20        //擦除一扇区数据（每扇区4KB）
#define W25Qxx_BlockErase32          0x52        //擦除一块数据（每块32Kb）
#define W25Qxx_BlockErase64          0xD8        //擦除一块数据（每块64Kb）
#define W25Qxx_ChipErase             0xC7        //擦除所有数据（W25Q32共4MB）
#define W25Qxx_PowerDown             0xB9        //FLASH芯片掉电模式
#define W25Qxx_ReleasePowerdown      0xAB        //FLASH芯片从掉电模式中恢复
#define W25Qxx_DeviceID              0x9F        //读取ID

/*--------------------------------------------------------------
 * 功能: 初始化W25QXX
 * 需要根据不同型号的芯片设置不同的ID号
 * 返回值: u8 成功返回success  失败返回ERROR
----------------------------------------------------------------*/
u8 W25Qxx_init(void);

/*--------------------------------------------------------------
 * 功能: W25QXX数据扇区擦除（每个扇区4KB，扇区是最小擦除单位）
 * SectorAddr：扇区首地址
----------------------------------------------------------------*/
void W25Qxx_Sector_Erase(u32 SectorAddr);

/*--------------------------------------------------------------
 * 功能: W25QXX整个芯片擦除（等待时间较长）
----------------------------------------------------------------*/
void W25Qxx_Chip_Erase(void);

/*--------------------------------------------------------------
 * 功能: W25Qxx页写入
 * 参数: str 要写入的内容
 * 参数: WriteAddr 写入地址
 * 参数: NumByteToWrite 写入长度
----------------------------------------------------------------*/
void W25Qxx_Page_Write(u8 *str, u32 WriteAddr, u16 NumByteToWrite);

/*--------------------------------------------------------------
 * 功能: W25Qxx数据写入（不定长数据）
 * 参数: str 要写入的数据
 * 参数: WriteAddr 写入的地址
 * 参数: NumByteToWrite 写入的长度
----------------------------------------------------------------*/
void W25Qxx_Data_Write(u8* str, u32 WriteAddr, u16 NumByteToWrite);

/*--------------------------------------------------------------
 * 功能: 读取W25Qxx中的数据
 * 参数: str 读出数据要存放的位置
 * 参数: ReadAddr 读取地址
 * 参数: NumByteToRead 读取长度
----------------------------------------------------------------*/
void W25Qxx_Data_Read(u8* str,u32 ReadAddr,u32 NumByteToRead);

/*--------------------------------------------------------------
 * 功能: 进入掉电模式
----------------------------------------------------------------*/
void W25Qxx_Powerdown(void);

/*--------------------------------------------------------------
 * 功能: 唤醒
----------------------------------------------------------------*/
void W25Qxx_WakeUP(void);

#endif
